package com.fyz.aaronfjava.util;

import com.fyz.aaronfjava.common.exception.AssertException;

import java.text.MessageFormat;

/**
 * @Author：fanyaozhou
 * @Date：2023/11/30 16:51
 * @description 断言工具类
 */
public class Assert {

    /**
     * 错误码
     */
    public static final String IS_NULL = "00";
    public static final String NOT_NULL = "01";
    public static final String IS_TRUE = "02";
    public static final String IS_FALSE = "03";



    /**
     * 断言对象为空，如果对象不为空时，抛出异常
     *
     * @param obj       断言对象
     * @param pattern   消息格式，使用{@link MessageFormat}格式化
     * @param args 消息参数
     */
    public static void isNull(Object obj, String pattern, Object... args) {
        if (obj != null) {
            throwException(IS_NULL,pattern, args);
        }
    }

    /**
     * 断言对象不为空，如果对象为空,抛出异常
     *
     * @param obj       断言对象
     * @param pattern   消息格式，使用{@link MessageFormat}格式化
     * @param args 消息参数
     */
    public static void notNull(Object obj, String pattern, Object... args) {
        if (obj == null) {
            throwException(NOT_NULL,pattern, args);
        }
    }

    /**
     * 断言表达式为真，如果表达式为false时，抛出异常
     *
     * @param expression 断言表达式
     * @param pattern    消息格式，使用{@link MessageFormat}格式化
     * @param args  消息参数
     */
    public static void isTrue(boolean expression, String pattern, Object... args) {
        if (!expression) {
            throwException(IS_TRUE,pattern, args);
        }
    }

    /**
     * 断言表达式为false 如果表达式为真是抛出异常
     *
     * @param expression 断言表达式
     * @param pattern    消息格式，使用{@link MessageFormat}格式化
     * @param args  消息参数
     */
    public static void isFalse(boolean expression, String pattern, Object... args) {
        if (expression) {
            throwException(IS_FALSE,pattern, args);
        }
    }

    /**
     * 抛出异常
     * pattern是类似如下的字符串 "first {0} second {1}"
     * 这里{0}和{1}是占位符 分别对应第 1 个和第 2 个参数，前后顺序允许自行改变
     * @param pattern   消息格式，使用{@link MessageFormat}格式化
     * @param args 消息参数
     */
    private static void throwException(String code,String pattern, Object... args) {
        String msg = args != null ? MessageFormat.format(pattern, args) : pattern;
        //具体抛出的异常自己定义
        throw new AssertException(code,msg);
    }

}
